wayland: Get implicit grab serial information from tablet devices
authorJason Gerecke <killertofu@gmail.com>
Fri, 23 Jun 2017 18:17:53 +0000 (11:17 -0700)
committerCarlos Garnacho <carlosg@gnome.org>
Thu, 20 Jul 2017 12:27:28 +0000 (14:27 +0200)
If a tablet device is used to perform actions like window moving or resizing,
GTK must provide the correct implicit grab serial number over Wayland to Mutter
in order for the action to succeed. This commit adds tablet support to the
implicit serial getters.

https://bugzilla.gnome.org/show_bug.cgi?id=777333

gdk/wayland/gdkdevice-wayland.c

index f46952dde4185eaa87ca5dd6ccbe3b075053d4b6..780906b7d201106fb8f0444bd2230385525e2838 100644 (file)
@@ -5050,9 +5050,25 @@ _gdk_wayland_device_get_implicit_grab_serial (GdkWaylandDevice *device,
   if (sequence)
     touch = gdk_wayland_seat_get_touch (GDK_WAYLAND_SEAT (seat),
                                         GDK_EVENT_SEQUENCE_TO_SLOT (sequence));
+
   if (touch)
     return touch->touch_down_serial;
-  else
+
+  if (event)
+    {
+      GdkDevice *source = gdk_event_get_source_device (event);
+      GdkWaylandSeat *wayland_seat = GDK_WAYLAND_SEAT (seat);
+      GList *l;
+
+      for (l = wayland_seat->tablets; l; l = l->next)
+        {
+          GdkWaylandTabletData *tablet = l->data;
+
+          if (tablet->current_device == source)
+            return tablet->pointer_info.press_serial;
+        }
+    }
+
     return GDK_WAYLAND_SEAT (seat)->pointer_info.press_serial;
 }
 
@@ -5063,6 +5079,7 @@ _gdk_wayland_seat_get_last_implicit_grab_serial (GdkSeat           *seat,
   GdkWaylandSeat *wayland_seat;
   GdkWaylandTouchData *touch;
   GHashTableIter iter;
+  GList *l;
   uint32_t serial;
 
   wayland_seat = GDK_WAYLAND_SEAT (seat);
@@ -5076,6 +5093,14 @@ _gdk_wayland_seat_get_last_implicit_grab_serial (GdkSeat           *seat,
   if (wayland_seat->pointer_info.press_serial > serial)
     serial = wayland_seat->pointer_info.press_serial;
 
+  for (l = wayland_seat->tablets; l; l = l->next)
+    {
+      GdkWaylandTabletData *tablet = l->data;
+
+      if (tablet->pointer_info.press_serial > serial)
+        serial = tablet->pointer_info.press_serial;
+    }
+
   while (g_hash_table_iter_next (&iter, NULL, (gpointer *) &touch))
     {
       if (touch->touch_down_serial > serial)